package com.cmii.sjw.department.control.jsc.util;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MapUtils {
//    public static void main(String[] args) {
//        try {
//            // 1、根据地址获取经纬度
//            Map<String, String> lonAndLat = getLonAndLat("沙实幼学雅幼儿园", "716c08a5bf8674ae42da7d05eb2fbb96");
//            System.out.println("转换后经纬度为：" + lonAndLat);
//
//            // 2、根据经纬度获取地址
////            String formattedAddress = getAMapByLngAndLat("106.551787", "29.562680", "716c08a5bf8674ae42da7d05eb2fbb96");
////            System.out.println("转换后地址为：" + formattedAddress);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }


public static void main(String[] args) throws InterruptedException {
    List<String> list = new ArrayList<String>();
        list.add("重庆市凤鸣山中学校");
        list.add("重庆市上桥中学校");
        list.add("沙坪坝区树人小学校");
        list.add("四川外国语附属小学");
        list.add("重庆市沙坪坝小学校");
        list.add("沙小沙滨学校");
        list.add("沙坪坝区育英小学校");
        list.add("巴师附小");
        list.add("沙坪坝区第一实验小学校");
        list.add("实验一小天星小学");
        list.add("沙坪坝区中梁镇小学校");
        list.add("沙坪坝区实验幼儿园");
        list.add("沙实幼学雅幼儿园");
    list.add("沙实幼慧雅幼儿园");
    list.add("沙实幼乐雅幼儿园");
    list.add("沙实幼行雅幼儿园");
    list.add("沙实幼和雅幼儿园");
    list.add("沙实幼正雅幼儿园");
    list.add("凤天幼儿园");
    list.add("沙滨寻光幼儿园");
    list.add("沙坪坝区树人小学幼儿");
    list.add("树人金沙幼儿园");
    list.add("树人沙磁幼儿园");


        for (String address : list) {
            try {
                Map<String, String> lonAndLat = getLonAndLat(address, "716c08a5bf8674ae42da7d05eb2fbb96");
                System.out.println(address + "：" + lonAndLat);
            } catch (Exception e) {
                System.out.println(address + "：" + "转换失败");
                e.printStackTrace();
            }
            // 添加延时，防止QPS超出限制
            Thread.sleep(1000); // 延时100毫秒
        }

}

    /**
     * 地址转换为经纬度
     *
     * @param address 地址
     * @param key     高德地图应用key
     * @return 经纬度
     */
    public static Map getLonAndLat(String address, String key) {
        // 返回输入地址address的经纬度信息, 格式是 经度,纬度
        String queryUrl = "http://restapi.amap.com/v3/geocode/geo?key=" + key + "&address=" + address;
        // 高德接口返回的是JSON格式的字符串
        String queryResult = getResponse(queryUrl);
        Map<String, String> map = new HashMap<String, String>();
        JSONObject obj = JSONObject.parseObject(queryResult);
        if (obj.get("status").toString().equals("1")) {
            JSONArray jsonArray = JSONArray.parseArray(obj.getString("geocodes"));
            JSONObject jobJSON = (JSONObject) jsonArray.get(0);
            String location = jobJSON.get("location").toString();
            System.out.println("经纬度：" + location);
            String[] lonAndLat = location.split(",");
            if (lonAndLat != null && lonAndLat.length == 2) {
                map.put("lng", lonAndLat[0]);
                map.put("lat", lonAndLat[1]);
            }
            System.out.println(map);
            return map;
        } else {
            throw new RuntimeException("地址转换经纬度失败，错误码：" + obj.get("infocode"));
        }
    }

    /**
     * 将经纬度getLng， getLat 通过getAMapByLngAndLat方法转换地址
     *
     * @param getLng 经度
     * @param getLat 纬度
     * @param key    高德地图应用key
     * @return 地址名称
     * @throws Exception
     */
    public static String getAMapByLngAndLat(String getLng, String getLat, String key) throws Exception {
        String url;
        try {
            url = "http://restapi.amap.com/v3/geocode/regeo?output=JSON&location=" + getLng + ","
                    + getLat + "&key=" + key + "&radius=0&extensions=base";
            String queryResult = getResponse(url); // 高德接品返回的是JSON格式的字符串
            // 将获取结果转为json数据
            JSONObject obj = JSONObject.parseObject(queryResult);
            System.out.println("obj为：" + obj);
            if (obj.get("status").toString().equals("1")) {
                // 如果没有返回-1
                JSONObject regeocode = obj.getJSONObject("regeocode");
                if (regeocode.size() > 0) {
                    // 在regeocode中拿到 formatted_address 具体位置
                    return regeocode.get("formatted_address").toString();
                } else {
                    throw new RuntimeException("未找到相匹配的地址！");
                }
            } else {
                throw new RuntimeException("请求错误！");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "-1";
    }

    /**
     * 根据两个定位点的经纬度算出两点间的距离
     *
     * @param startLonLat 起始经纬度
     * @param endLonLat   结束经纬度（目标经纬度）
     * @param key         高德地图应用key
     * @return 两个定位点之间的距离
     */
    private static long getDistance(String startLonLat, String endLonLat, String key) {
        // 返回起始地startAddr与目的地endAddr之间的距离，单位：米
        Long result ;
        String queryUrl = "http://restapi.amap.com/v3/distance?key=" + key + "&origins=" + startLonLat + "&destination=" + endLonLat;
        String queryResult = getResponse(queryUrl);
        JSONObject obj = JSONObject.parseObject(queryResult);
        JSONArray ja = obj.getJSONArray("results");
        JSONObject jobO = JSONObject.parseObject(ja.getString(0));
        result = Long.parseLong(jobO.get("distance").toString());
        System.out.println("距离：" + result);
        return result;
    }

    /**
     * 发送请求
     *
     * @param serverUrl 请求地址
     */
    private static String getResponse(String serverUrl) {
        // 用JAVA发起http请求，并返回json格式的结果
        StringBuffer result = new StringBuffer();
        try {
            URL url = new URL(serverUrl);
            URLConnection conn = url.openConnection();
            BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result.append(line);
            }
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result.toString();
    }
}


